#pragma once

#include "base_noncopyable.h"
#include <string>
#include <map>
#include <functional>
#include <vector>
#include <chrono>
#include <memory>

namespace El {
namespace WebServer {

// HTTP请求处理器的返回结果
struct HttpResponse {
    int status_code;          // HTTP状态码
    std::string content_type; // 内容类型
    std::string body;         // 响应体
};

// HTTP请求处理器的参数
struct HttpRequest {
    std::string method;                         // 请求方法
    std::string uri;                            // 请求URI
    std::string body;                           // 请求体
    std::map<std::string, std::string> headers; // 请求头
};

// HTTP请求处理器函数类型
using HttpHandler = std::function<HttpResponse(const HttpRequest &)>;

// WebSocket事件类型
enum class WebSocketEventType {
    Connect,       // 连接建立
    Message,       // 收到消息
    BinaryMessage, // 收到二进制消息
    Disconnect,    // 连接断开
    Error          // 错误
};

// WebSocket事件
struct WebSocketEvent {
    WebSocketEventType type;          // 事件类型
    void *connection;                 // 连接指针
    std::string message;              // 文本消息内容
    std::vector<uint8_t> binary_data; // 二进制消息内容
    std::string error;                // 错误信息
};

// WebSocket连接信息
struct WebSocketConnectionInfo {
    std::string uri;                                    // 连接的URI
    std::string remote_ip;                              // 远程IP地址
    uint16_t remote_port;                               // 远程端口
    bool is_secure;                                     // 是否是安全连接(wss)
    std::chrono::system_clock::time_point connect_time; // 连接建立时间
};

// WebSocket事件处理回调
using WebSocketEventHandler = std::function<void(std::shared_ptr<WebSocketEvent> &)>;

// HTTP Server Interface
class IHttpServer {
public:
    static IHttpServer &GetInstance();

    virtual ~IHttpServer() = default;

    // 设置SSL证书
    virtual void SetSSLCert(const std::string &cert_file, const std::string &key_file) = 0;

    virtual bool Start() = 0;
    virtual void Stop() = 0;

    // 设置静态文件挂载点
    virtual bool SetMountPoint(const std::string &dir) = 0;

    // 添加token
    virtual void AddBearerToken(const std::string &token) = 0;

    // 删除token
    virtual void RemoveBearerToken(const std::string &token) = 0;

    // 检查token是否存在
    virtual bool HasBearerToken(const std::string &token) = 0;

    // 添加免鉴权的URL
    virtual void AddAuthExemptUrl(const std::string &url_pattern) = 0;

    // 移除免鉴权的URL
    virtual void RemoveAuthExemptUrl(const std::string &url_pattern) = 0;

    // 注册API处理器
    virtual bool RegisterHandler(const std::string &method,      // HTTP方法 (GET/POST等)
                                 const std::string &uri_pattern, // URI模式
                                 HttpHandler handler) = 0;       // 处理函数

    // 注册WebSocket处理器
    virtual bool RegisterWebSocketHandler(const std::string &uri_pattern, WebSocketEventHandler handler) = 0;

    // 发送WebSocket文本消息
    virtual bool SendWebSocketTextMessage(void *connection, const std::string &message) = 0;

    // 发送WebSocket二进制消息
    virtual bool SendWebSocketBinaryMessage(void *connection, const std::vector<uint8_t> &data) = 0;

    // 关闭WebSocket连接
    virtual void CloseWebSocketConnection(void *connection, int status_code = 1000, const std::string &reason = "") = 0;

    // 获取连接信息
    virtual bool GetWebSocketConnectionInfo(void *connection, WebSocketConnectionInfo &info) = 0;

    // 获取所有活跃连接
    virtual std::vector<void *> GetAllWebSocketConnections(const std::string &uri_pattern = "") = 0;

    // 向所有匹配URI的连接广播消息
    virtual int BroadcastWebSocketMessage(const std::string &uri_pattern, const std::string &message) = 0;
};

} // namespace WebServer
} // namespace El
